package com.wpen.unit.infra.repository.job.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;

import java.io.Serializable;
import java.util.List;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.wpen.unit.enums.OnlineStatus;
import com.wpen.unit.exception.UpdateZeroException;
import com.wpen.unit.infra.mybatis.job.mapper.AgentRegistryMapper;
import com.wpen.unit.infra.mybatis.job.po.AgentRegistryPo;
import com.wpen.unit.infra.mybatis.job.po.AgentRegistryPo.AgentRegistryColumns;
import com.wpen.unit.infra.repository.job.AgentRegistryRepository;
import com.wpen.unit.utils.StringUtil;

/**
 * 执行器注册维护.
 * 
 * @author Wang Peng
 * @date 2022-12-08
 *
 */
@Repository
@Transactional
public class AgentRegistryRepositoryImpl extends ServiceImpl<AgentRegistryMapper, AgentRegistryPo>
        implements AgentRegistryRepository {

    @Override
    public boolean updateStatusByIpv4(String ipv4, OnlineStatus onlineStatus) {
        UpdateWrapper<AgentRegistryPo> updateWrapper = Wrappers.update();
        updateWrapper.eq(AgentRegistryColumns.AGENT_IPV4.name(), ipv4);
        AgentRegistryPo agentRegistryPo = new AgentRegistryPo();
        agentRegistryPo.setOnlineStatus(onlineStatus.value());
        boolean rs = super.update(agentRegistryPo, updateWrapper);
        if (!rs) {
            throw new UpdateZeroException();
        }
        return rs;
    }

    @Override
    public AgentRegistryPo queryByIpv4(String ipv4) {
        QueryWrapper<AgentRegistryPo> queryWrapper = Wrappers.query();
        queryWrapper.eq(AgentRegistryColumns.AGENT_IPV4.name(), ipv4);
        return getBaseMapper().selectOne(queryWrapper);
    }

    @Override
    public AgentRegistryPo queryByIpv4WithLock(String ipv4) {
        QueryWrapper<AgentRegistryPo> queryWrapper = Wrappers.query();
        queryWrapper.eq(AgentRegistryColumns.AGENT_IPV4.name(), ipv4);
        queryWrapper.last(" FOR UPDATE");
        return getBaseMapper().selectOne(queryWrapper);
    }

    @Override
    public List<AgentRegistryPo> queryByAz() {
        QueryWrapper<AgentRegistryPo> queryWrapper = Wrappers.query();
        queryWrapper.eq(AgentRegistryColumns.ONLINE_STATUS.name(), OnlineStatus.Health.value());
        return getBaseMapper().selectList(queryWrapper);
    }

    @Override
    public long count(AgentRegistryPo agentRegistryPo) {
        QueryWrapper<AgentRegistryPo> queryWrapper = createQuery(agentRegistryPo);
        return super.count(queryWrapper);
    }

    @Override
    public List<AgentRegistryPo> queryList(int index, int size, AgentRegistryPo agentRegistryPo) {
        QueryWrapper<AgentRegistryPo> queryWrapper = createQuery(agentRegistryPo);
        if (size > 0) {
            Page<AgentRegistryPo> page = new Page<>(index, size, false);
            return super.page(page, queryWrapper).getRecords();
        }
        // queryWrapper.orderBy(true, false, BatchInfoPoColumns.ID.name());
        return getBaseMapper().selectList(queryWrapper);
    }

    private QueryWrapper<AgentRegistryPo> createQuery(AgentRegistryPo agentRegistryPo) {
        QueryWrapper<AgentRegistryPo> queryWrapper = Wrappers.query();
        if (agentRegistryPo.getId() != null) {
            queryWrapper.eq(AgentRegistryColumns.ID.name(), agentRegistryPo.getId());
        }
        // if (StringUtil.isNotEmpty(agentRegistryPo.getAgentHostname())) {
        // queryWrapper.eq(AgentRegistryColumns.AGENT_HOSTNAME.name(),
        // agentRegistryPo.getAgentHostname());
        // }
        if (StringUtil.isNotEmpty(agentRegistryPo.getAgentIpv4())) {
            queryWrapper.eq(AgentRegistryColumns.AGENT_IPV4.name(), agentRegistryPo.getAgentIpv4());
        }
//        if (agentRegistryPo.getAgentPort() != null) {
//            queryWrapper.eq(AgentRegistryColumns.AGENT_PORT.name(), agentRegistryPo.getAgentPort());
//        }
        if (StringUtil.isNotEmpty(agentRegistryPo.getOnlineStatus())) {
            queryWrapper.eq(AgentRegistryColumns.ONLINE_STATUS.name(), agentRegistryPo.getOnlineStatus());
        }
        // if (StringUtil.isNotEmpty(agentRegistryPo.getAgentDesc())) {
        // queryWrapper.eq(AgentRegistryColumns.AGENT_DESC.name(),
        // agentRegistryPo.getAgentDesc());
        // }
        // if (StringUtil.isNotEmpty(agentRegistryPo.getBizCode())) {
        // queryWrapper.eq(AgentRegistryColumns.BIZ_CODE.name(),
        // agentRegistryPo.getBizCode());
        // }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getCreateTime())) {
//            queryWrapper.eq(AgentRegistryColumns.CREATE_TIME.name(), agentRegistryPo.getCreateTime());
//        }
//        if (agentRegistryPo.getVersion() != null) {
//            queryWrapper.eq(AgentRegistryColumns.VERSION.name(), agentRegistryPo.getVersion());
//        }
        return queryWrapper;
    }

    @Override
    public AgentRegistryPo queryFirst(AgentRegistryPo agentRegistryPo) {
        QueryWrapper<AgentRegistryPo> queryWrapper = Wrappers.query();
        if (agentRegistryPo.getId() != null) {
            queryWrapper.eq(AgentRegistryColumns.ID.name(), agentRegistryPo.getId());
        }
        // if (StringUtil.isNotEmpty(agentRegistryPo.getAgentHostname())) {
        // queryWrapper.eq(AgentRegistryColumns.AGENT_HOSTNAME.name(),
        // agentRegistryPo.getAgentHostname());
        // }
        if (StringUtil.isNotEmpty(agentRegistryPo.getAgentIpv4())) {
            queryWrapper.eq(AgentRegistryColumns.AGENT_IPV4.name(), agentRegistryPo.getAgentIpv4());
        }
//        if (agentRegistryPo.getAgentPort() != null) {
//            queryWrapper.eq(AgentRegistryColumns.AGENT_PORT.name(), agentRegistryPo.getAgentPort());
//        }
        if (StringUtil.isNotEmpty(agentRegistryPo.getOnlineStatus())) {
            queryWrapper.eq(AgentRegistryColumns.ONLINE_STATUS.name(), agentRegistryPo.getOnlineStatus());
        }
        // if (StringUtil.isNotEmpty(agentRegistryPo.getAgentDesc())) {
        // queryWrapper.eq(AgentRegistryColumns.AGENT_DESC.name(),
        // agentRegistryPo.getAgentDesc());
        // }
        // if (StringUtil.isNotEmpty(agentRegistryPo.getBizCode())) {
        // queryWrapper.eq(AgentRegistryColumns.BIZ_CODE.name(),
        // agentRegistryPo.getBizCode());
        // }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getCreateTime())) {
//            queryWrapper.eq(AgentRegistryColumns.CREATE_TIME.name(), agentRegistryPo.getCreateTime());
//        }
//        if (agentRegistryPo.getVersion() != null) {
//            queryWrapper.eq(AgentRegistryColumns.VERSION.name(), agentRegistryPo.getVersion());
//        }
        // queryWrapper.orderBy(true, false, AgentRegistryPoColumns.ID.name());
        return super.getOne(queryWrapper);
    }

    @Override
    public AgentRegistryPo queryById(Serializable id) {
        return super.getById(id);
    }

    @Override
    public boolean insert(AgentRegistryPo agentRegistryPo) {
        agentRegistryPo.setVersion(1);
        agentRegistryPo.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
        return super.save(agentRegistryPo);
    }

    @Override
    public boolean insertBatch(List<AgentRegistryPo> listAgentRegistryPos) {
        int rs = getBaseMapper().insertBatchSomeColumn(listAgentRegistryPos);
        return SqlHelper.retBool(rs);
    }

    @Override
    public boolean updateById(AgentRegistryPo agentRegistryPo) {
        UpdateWrapper<AgentRegistryPo> updateWrapper = Wrappers.update();
        updateWrapper.eq(AgentRegistryColumns.ID.name(), agentRegistryPo.getId());
        updateWrapper.eq(AgentRegistryColumns.VERSION.name(), agentRegistryPo.getVersion());
        agentRegistryPo.setVersion(agentRegistryPo.getVersion() + 1);
        boolean rs = super.update(agentRegistryPo, updateWrapper);
        // 根据ID更新所有字段，空值也更新
        // int num = getBaseMapper().alwaysUpdateSomeColumnById(BatchInfoPo);
        // boolean rs = SqlHelper.retBool(num);
        if (!rs) {
            throw new UpdateZeroException();
        }
        return rs;
    }

    @Override
    public boolean deleteByIds(Serializable[] ids) {
        UpdateWrapper<AgentRegistryPo> updateWrapper = Wrappers.update();
        updateWrapper.in(AgentRegistryColumns.ID.name(), (Object[]) ids);
        return super.remove(updateWrapper);
    }

//    public AgentRegistryPo queryByExample(AgentRegistryPo agentRegistryPo) {
//        QueryWrapper<AgentRegistryPo> queryWrapper = Wrappers.query();
//        if (agentRegistryPo.getId() != null) {
//            queryWrapper.eq(AgentRegistryColumns.ID.name(), agentRegistryPo.getId());
//        }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getAzCode())) {
//            queryWrapper.eq(AgentRegistryColumns.AZ_CODE.name(), agentRegistryPo.getAzCode());
//        }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getAgentHostname())) {
//            queryWrapper.eq(AgentRegistryColumns.AGENT_HOSTNAME.name(), agentRegistryPo.getAgentHostname());
//        }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getAgentIpv4())) {
//            queryWrapper.eq(AgentRegistryColumns.AGENT_IPV4.name(), agentRegistryPo.getAgentIpv4());
//        }
//        if (agentRegistryPo.getAgentPort() != null) {
//            queryWrapper.eq(AgentRegistryColumns.AGENT_PORT.name(), agentRegistryPo.getAgentPort());
//        }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getOnlineStatus())) {
//            queryWrapper.eq(AgentRegistryColumns.ONLINE_STATUS.name(), agentRegistryPo.getOnlineStatus());
//        }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getAgentDesc())) {
//            queryWrapper.eq(AgentRegistryColumns.AGENT_DESC.name(), agentRegistryPo.getAgentDesc());
//        }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getBizCode())) {
//            queryWrapper.eq(AgentRegistryColumns.BIZ_CODE.name(), agentRegistryPo.getBizCode());
//        }
//        if (StringUtil.isNotEmpty(agentRegistryPo.getCreateTime())) {
//            queryWrapper.eq(AgentRegistryColumns.CREATE_TIME.name(), agentRegistryPo.getCreateTime());
//        }
//        if (agentRegistryPo.getVersion() != null) {
//            queryWrapper.eq(AgentRegistryColumns.VERSION.name(), agentRegistryPo.getVersion());
//        }
//		Page<AgentRegistryPo> page = new Page<>(0, 1, false);
//		queryWrapper.orderBy(true, false, AgentRegistryPoColumns.ID.name());
//    }

}
